﻿
// myProjectView.h: CmyProjectView 类的接口
//

#pragma once



class CmyProjectView : public CView
{
protected: // 仅从序列化创建
	CmyProjectView() noexcept;
	DECLARE_DYNCREATE(CmyProjectView)

// 特性
public:
	CmyProjectDoc* GetDocument() const;
	// 边记录：
	struct CAET
	{//记录边的结构体
		double      x;//边的x坐标
		int         yMax;//顶点y坐标最大值
		double      k;   //边斜率的倒数
		CAET* next;    //下一条边记录指针
	};
	// 桶记录
	struct CBucket
	{//记录扫描线的结构体
		int          ScanLine;       //扫描线y坐标
		CAET* p;                //桶上的边表头指针
		CBucket* next;  //下一条桶记录指针
	} *HeadB{nullptr}, * AET{ nullptr };

	int flag; // 初始化或者
	int scanline;	// 扫描线y坐标
	int ScanMax;
	int ScanMin;

	void makeBucketHead();
	void make_aet();
	void tianchong(CDC* pDC);
	int sheru(double x);	// 对x进行四舍五入
	void insert(CBucket* CB, CAET* p);	// 结点插入边表


// 操作
public:
	void DrawCtrPolygon();
	void OnRButtonDown(UINT nFlags, CPoint point);
	void OnMouseMove(UINT nFlags, CPoint point);
	//绘制控制多边形
// 重写
public:
	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// 实现
public:
	virtual ~CmyProjectView();
	CPoint* pt;//顶点
	CPoint* pt_project;//映射后的顶点
	int CtrlPNum{ 4 };
	CAET* ourAet = nullptr; // 记录所有的边
	bool m_flag;
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnHuitu();
	afx_msg
		// void lllllllOnDuobianxing();
	void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnDuobianxing();
};

#ifndef _DEBUG  // myProjectView.cpp 中的调试版本
inline CmyProjectDoc* CmyProjectView::GetDocument() const
   { return reinterpret_cast<CmyProjectDoc*>(m_pDocument); }
#endif

